package cn.wolfcode.wolf2w.business.service;

import cn.wolfcode.wolf2w.business.api.domain.*;
import cn.wolfcode.wolf2w.business.query.SearchQuery;
import org.springframework.data.domain.PageImpl;

import java.lang.reflect.InvocationTargetException;

public interface ISearchService {
    void saveStrategy(StrategyEs strategyEs);

    //因为需要查的表比较多，而且这些表没有共同的父类，所以使用泛型。

    //高亮查询通用接口
    //高亮 T表示泛型,可以查攻略，可以查问答....
    //T是mysql类型的，不是ES的类型
    //clazz表示数据库，esClazz表示ES的类型
    //SearchQuery qo 查询条件，必须有的
    //fields 查询的字段

    /**
     * 1. 方法整体功能
     * 该方法的核心作用是：根据传入的查询条件，在 ES 中搜索指定类型的文档，
     * 对匹配的关键词字段进行高亮显示处理，最终将搜索结果转换为目标类型并以分页形式返回。
     *
     *2. 泛型声明 <T>
     * 方法名前的 <T> 表示这是一个泛型方法，T 是类型占位符，代表方法返回结果中分页数据的元素类型。
     * 通过泛型可以让方法灵活适配不同的返回类型，无需为每种类型单独定义方法。
     *
     * 3. 返回类型 PageImpl<T>
     * PageImpl 是 Spring Data 中用于实现分页功能的类（实现了 Page 接口），
     * 包含分页信息（总条数、总页数、当前页数据等）。这里 PageImpl<T> 表示返回的是 “元素类型为 T” 的分页结果。
     *
     * 4. 参数详解
     * Class<T> clazz：目标类型的 Class 对象，用于指定搜索结果最终要转换的类型（例如将 ES 文档转换为业务层的 DTO 或实体类）。
     * Class<?> esClazz：ES 文档对应的实体类的 Class 对象，用于指定要搜索的 ES 索引对应的实体类型
     * （ES 中数据以 “文档” 形式存储，通常会映射为 Java 实体类）。
     * SearchQuery qo：通常是 “查询对象（Query Object）”，封装了搜索所需的条件，例如：
     * 分页参数（页码、每页条数）；
     * 搜索关键词；
     * 过滤条件（如时间范围、分类等）。
     * String... fields：可变参数，指定需要进行 “高亮显示” 的字段名。在 ES 搜索中，高亮显示会将匹配关键词的部分文本用特殊标签
     * （如 <em>）包裹，方便前端展示时突出显示匹配内容（例如搜索 “旅游” 时，结果中包含 “旅游” 的字段会被标记）。
     *
     * **/


    //可以查多个分页数据
    <T> PageImpl<T> searchWithHightLight(Class<T> clazz,
                                         Class<?> esClazz,
                                         SearchQuery qo,
                                         String... fields) throws InvocationTargetException, IllegalAccessException;
//
//    <T> PageImpl<T> searchWithHightLightAndUser(Class<T> clazz,
//                                       Class<?> esClazz,
//                                       SearchQuery qo,
//                                       String... fields);


    void saveUserInfo(UserEs userInfoEs);

    void saveNote(NoteEs noteEs);

    void saveDestination(DestinationEs destinationEs);
}
